題目概述:
小明給小紅準備了n份新年禮物,但小明不會告訴小紅每件禮物的重量,小明將禮物重量和寫成一個子集。讓小紅猜每個禮物的重量。
例如:輸入:整數n 和 一個整數數組sum[2^n-1];整數數組裏麪包含重量值。
n=3;sum[]={12,6,18,5,17,11,23},sum內容爲相加的重量集合(本身不相加);
輸出:5,6,12;
解題思路:
集合中所有值都有可能是禮物重量,但最小的數值肯定是其中之一的禮物重量。
先對數組sum升序排列,然後從第一個數值與後面數值相加,如果所得“和”存在與數組中,則將與和相同的數值賦值爲0,然後再從第二個非零數值開始同樣步驟,最後的到非零數值就是各個禮物的重量。(注意不要本身相加和與零相加)
java程序算法:
package equnaer;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
public class qunaer {
public static void main(String[] args) {
/*Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] nn=new int[(int) (Math.pow(2,n)-1)];
if(n==1) {
System.out.println(nn[0]);
}else {
}*/
int[] nn=new int[] {12,6,18,5,17,11,23};
HashSet<Integer> set=new HashSet<>();
for(int i=0;i<nn.length;i++) {
set.add(nn[i]);
}
Arrays.sort(nn);
for(int x=0;x<nn.length;x++) {
if(nn[x]!=0) {
int temp=nn[x];
for(int i=x+1;i<nn.length;i++) {
if(set.contains(temp+nn[i])&&nn[i]!=0) {
for(int j=0;j<nn.length;j++) {
if(temp+nn[i]==nn[j])
nn[j]=0;
}
}
}
}
}
for(int i=0;i<nn.length;i++) {
if(nn[i]!=0) {
System.out.println(nn[i]);
}
}
}
}